Skip to content

tun: winroute#5887

Open
LjhAUMEM wants to merge 22 commits intoXTLS:mainfrom
LjhAUMEM:tun-winroute
Open

tun: winroute#5887
LjhAUMEM wants to merge 22 commits intoXTLS:mainfrom
LjhAUMEM:tun-winroute

Conversation

@LjhAUMEM
Copy link
Copy Markdown
Collaborator

@LjhAUMEM LjhAUMEM commented Apr 3, 2026

{
  "log": { "loglevel": "debug" },
  "inbounds": [
    {
      "protocol": "tun",
      "settings": {
        "name": "xray0",
        "mtu": [1500, 1280],
        "gateway": [
          "10.0.0.1/16",
          "fc00::1/64"
        ],
        "dns": [
          "1.1.1.1",
          "8.8.8.8"
          // "2606:4700:4700::1111",
          // "2001:4860:4860::8888"
        ],
        "userLevel": 0,
        "autoRoutingTable": [
          "0.0.0.0/0",
          "::/0"
        ]
        // ,"autoOutboundsInterface": "auto"
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 3, 2026

另外是不是可以给 sockopt.interface 增加 interface index 的支持

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

这个 auto-route 要加的话,mac 和 linux 肯定也会适配的,不用起名 winRoute

还要实现自动给出站没填 interface 的加上 interface,不过有同时插网线、连 wifi 的情况,先判断哪个是默认的?

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

还要实现自动给出站没填 interface 的加上 interface

这种东西肯定得加的,因为内核里 DoH 等自动请求也得绑个 interface 来绕过 tun 不然回环了,其它自动请求可没有 sockopt

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 3, 2026

那就先作为 draft 吧

auto-route 是作为 bool?我认为也要有一个类似 route 的可以指定 ip cidr

interface 当初想的是不手动指定就取第一个非 tun index 的传到 ctx 里

@Fangliding
Copy link
Copy Markdown
Member

直接用 RegisterDialerController 注入一个sockopt绑定接口就是了 doh什么的全走的这个接口 很久之前就考虑过这个问题了

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 3, 2026

也可以,反正 setsocketint 各大 os 都有,不用分 os

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

v2ray 的过度设计终于到了要发挥作用的时候了吗,但是 VLESS fallbacks 没走这个,REALITY 的话世界塞了个可以用外部 dial

但是 record_detect 没用那个,得改一下

Xray 启动时探测一下默认接口吧,auto-route 可以保留现在的配置格式,这样挺好的,毕竟未来的 auto-redirect 也是这格式

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

@Fangliding echForceQuery 配置项还有必要留着吗,开个 PR 删了吧

@Fangliding
Copy link
Copy Markdown
Member

之前有一个给伊朗无服务器用的莫名其妙的half 也毙了吗

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

那再想想,不过伊朗现在也用不上这个不是嘛

话说隔壁两家的 TUN 实现的 auto-redirect 是不是拿 /0 减掉 auto-redirect 来算路由表

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

不过感觉不如叫 auto-bypass,它和 auto-route。。。不对不能二选一,这块你们想下

@Fangliding
Copy link
Copy Markdown
Member

那东西我也觉得没用 用处太边缘而且他自己好像也不更了 好像他扔出来的模板都没那功能 纯ex人

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

既然没用到那就先删了吧,主要是感觉 v2rayN&G TLS 设置那里越来越眼花缭乱了

ECH any outer sni 这个前几天在群里讨论过,是不是现在的 uTLS 实现不了来着?

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

话说有了 ECH 这么大的位置,搞 QUIC 版 REALITY 倒是方便了很多,一开始就设计成国外运营商能配合的 REALITY 变种吧

@Fangliding
Copy link
Copy Markdown
Member

ECH any outer sni 这个前几天在群里讨论过,是不是现在的 uTLS 实现不了来着?

可以 主要是CF不支持 做了也没用 自建ECH的情况下outer完全可以自己填

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

可以 主要是CF不支持 做了也没用 自建ECH的情况下outer完全可以自己填

那就先加个自定义 outer sni 的功能吧,感觉 echConfigList 塞不下了,按之前说的把 sni 改成 outer.com+inner.com 吧

主要是正好也能把旧的客户端给 break 掉,这在以后全面普及 any outer sni 后会有帮助

@Fangliding
Copy link
Copy Markdown
Member

Fangliding commented Apr 3, 2026

random outer 哪怕是IETF最后做出来也是另一套逻辑 我稍微看了一下那个ppt 和现在做一个土制的的盖过去肯定是不一样的 还是那句话这东西八字没一撇

@Fangliding
Copy link
Copy Markdown
Member

Fangliding commented Apr 3, 2026

还有我说的自建ECH可以自己填意思是生成 ECH Config 的时候 outer 可以自己写 然后就原生apply进去了 不需要任何新功能

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

有点难以想象“另一套逻辑”是啥逻辑,服务端定义可选 SNI 范围?都 2026 年了都 IPv6 了还在搞虚拟主机 SNI 分流那一套吗

@Fangliding
Copy link
Copy Markdown
Member

可能就是因为这些乱七八糟的原因才如此缓慢吧 我第一次看到这东西好像得是两年前24年那会了

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

想了一下有可能比如加了个额外的签名验证尝试以实现同 IP 区分多服务端?虽然 outer sni 一样,那的确是不能直接覆盖过去

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

那先不管了,@Fangliding 他这个 auto-route 的话得把 REALITY 仓库 record_detect.go 和 VLESS fallbacks 改一下,你看看

@Fangliding
Copy link
Copy Markdown
Member

这都要算吗 反正tun也就客户端用用应该无所谓吧 singbox clash那些带tun的都没见管

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 3, 2026

那有人提的话再说吧

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 4, 2026

multi dns instance 有在计划内吗

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 4, 2026

multi dns instance 有在计划内吗

先不管这个,先实现个 Xray 启动时自动探测出默认 interface 并应用到核心发出的连接吧,这个会不会影响 sendThrough

还有你看下隔壁两家的 auto-redirect 是不是拿 /0 减掉、自动计算路由表,如果是的话那它和 auto-route 的优先级?

它们的 auto 是不是还包括了把 routing 的 IP 规则自动弄过来,不过感觉这样干不好吧,direct/freedom 不一定是单纯发出

对了还需要实现个指定 TUN 的 IPv4 & IPv6,TUN 这块就差不多了

@patterniha
Copy link
Copy Markdown
Collaborator

I also think that thing is useless and too peripheral, and it seems like he doesn't update it anymore. It seems like the templates he releases don't even have that function; it's just ridiculous.

Although the internet is still down and only DNS or IP-Spoofing based methods work in Iran, they opened some Cloudflare IPs for some White SNIs for a few hours (They've done this a few times in the last month and closed it again.), and it is clear that they are implementing a new system.

"cloudflare-ech.com" was not in their whitelist, also fragments method didn't work, they simply close the connection when they can't read the sni.

but i tested some ip/tcp-header-manipulation methods and it can bypass this restriction:

method 1 (simplest one): send a white-sni-client-hello-packet with low ip-ttl before main-clienthello-packet: because GFW sees this packet and interprets it as a white-sni-clienthello-packet , so allow other packets without checking, but this packet does not reach to the cloudflare servers, so you can send your main-blocked-sni-clienthello-packet later !!!

Apart from method 1, I successfully tested 2 other methods (related to tcp-header) and with all of them I was able to successfully connect to cloudflare cdn.

///

@RPRX

It's time to prioritize raw-sockets-outbounds.

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 4, 2026

auto-redirect 是什么需求,我还在看 linux go 里怎么实现路由,不会只能 exec 吧

晚点我去视奸下其他两家吧,虽然我也不是很想当 skid

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 5, 2026

update,更新几点信息

  1. go 可以通过 vishvananda/netlink 在 linux 上操作路由
  2. 没有所谓的两家,全都是一家 - singtun,hysteria 也和 mihomo 一样没有造轮子
  3. autoRedirect 不是简单的操作静态路由,在 windows 上,通过在 WFP 侧拦截流量然后进行的路由,这种方式还可以根据 pid 进行分流
  4. excludeRoute 在非 autoRedirect 下是通过静态路由实现,比如要在 0.0.0.0/0 排除 192.168.1.1/32 就会看到
0.0.0.0/1
128.0.0.0/2
192.0.0.0/9
192.128.0.0/11
192.160.0.0/13
192.168.0.0/24
192.168.1.0/32
192.168.1.2/31
192.168.1.4/30
192.168.1.8/29
192.168.1.16/28
192.168.1.32/27
192.168.1.64/26
192.168.1.128/25
192.168.2.0/23
192.168.4.0/22
192.168.8.0/21
192.168.16.0/20
192.168.32.0/19
192.168.64.0/18
192.168.128.0/17
192.169.0.0/16
192.170.0.0/15
192.172.0.0/14
192.176.0.0/12
192.192.0.0/10
193.0.0.0/8
194.0.0.0/7
196.0.0.0/6
200.0.0.0/5
208.0.0.0/4
224.0.0.0/3
func main8() {
	var builder netipx.IPSetBuilder
	builder.AddPrefix(netip.MustParsePrefix("0.0.0.0/0"))
	builder.RemovePrefix(netip.MustParsePrefix("192.168.1.1/32"))
	result, _ := builder.IPSet()
	for _, p := range result.Prefixes() {
		fmt.Println(p)
	}
}

关于这个 pr,将会侧重在 windows 上的 autoRedirect 以及 tun 的 defaultInterface,其他 os 的路由先不说我没有某些 os,linux 上我也不会用到 tun,所以谁用谁加吧

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 9, 2026

应该没什么要改了

@mclovin-2k
Copy link
Copy Markdown

mclovin-2k commented Apr 9, 2026

咱们这边能不能考虑一下Windows平台下,开热点的情况啊?
SingBox 那边就没有考虑这个,它的TUN+auto route和热点同时开的话就会冲突。

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 9, 2026

咱们这边能不能考虑一下Windows平台下,开热点的情况啊? SingBox 那边就没有考虑这个,它的TUN和热点同时开的话就会冲突。

如果合并了你可以试试,现在没有 strictroute 和 redirect,对系统入侵相对较小

@Fangliding
Copy link
Copy Markdown
Member

Fangliding commented Apr 9, 2026

IMG_20260409_151114_210

我之前说了不要把这些东西break掉了有人要用的

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 9, 2026

那localdns那里你觉得该怎么改?

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

LjhAUMEM commented Apr 9, 2026

我之前说了不要把这些东西break掉了有人要用的

这里说的吧,但之前那个 pr 好像也没 break?

我搜了下没调用才删了,原来 xray:api:beta 不是在 core 里用的吗

@Fangliding
Copy link
Copy Markdown
Member

Fangliding commented Apr 9, 2026

我之前说了不要把这些东西break掉了有人要用的

这里说的吧,但之前那个 pr 好像也没 break?

我搜了下没调用才删了,原来 xray:api:beta 不是在 core 里用的吗

那个接口大抵没人用 只是尽量不改 这个是真要用的 那么多dialer包装就是为了这个可以正常用 比如v2rayng就要这个hook掉dialer来绕过自己

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

应该没啥了,按照描述给的配置可以直接跑起来

还有一个就是如果默认出站的 address 是域名且 protocol 是 udp 类可能需要显示指定 streamSettings.sockopt.domainStrategy: UseIPv4v6

因为

destAddr, err := net.ResolveUDPAddr("udp", dest.NetAddr())

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

顺带发现先关 stack 再关 tun 在 windows 仍有 crash 现象,在 writepacket,加了个锁暂时先修了

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 11, 2026

  1. interface 的意思是出站的 auto-interface?没有自动探测吗?
  2. route 改名 autoRouteIPs
  3. address 改名 myGatewayIPs
  4. dns 是分配的 DNS 吗,我看没手动改路由表时有些 255 的请求是不是就是搞这个的

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

  1. interface 的意思是出站的 auto-interface?没有自动探测吗?

写 auto 是自动,其他就指定,因为自动只是取第一个非tun非loopback的网卡,可能取到的不是希望的

4. dns 是分配的 DNS 吗,我看没手动改路由表时有些 255 的请求是不是就是搞这个的

如果端口是 137 那是没有默认 myGatewayIPs 系统发来的 NetBIOS 探测包,分配 ipv4 用的

好像仅 windows,可以按接口配置 dns,要不改成 windns

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 12, 2026

写 auto 是自动,其他就指定,因为自动只是取第一个非tun非loopback的网卡,可能取到的不是希望的

有没有判断一下有没有实际 IP 地址,有些网卡虽然存在但没插线/没连接就没 IP 地址

这个改名叫 autoOutboundsInterface 吧,autoRouteIPs 存在时默认值 "auto",否则默认不生效

好像仅 windows,可以按接口配置 dns,要不改成 windns

刚拿高贵的 iPhone 看了眼,iOS 也是在单个 wifi 详情里配置 DNS,不需要这样改,不过其它数组都是复数,要不要改一下

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

有没有判断一下有没有实际 IP 地址,有些网卡虽然存在但没插线/没连接就没 IP 地址

多增加了两个条件,up flag 和 len(addrs) > 0

这个改名叫 autoOutboundsInterface 吧,autoRouteIPs 存在时默认值 "auto",否则默认不生效

目前只是改 infra 的,proto 要不要也同步

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 12, 2026

proto 都改,改一些名,代码顺序:

Name
MTU
Gateway
DNS
UserLevel
AutoRoutingTable
AutoOutboundsInterface

DNS 不配置时是什么行为?改成 udp://1.1.1.1:53 这种形式?DHCP 支持自定义端口吗?因为我看手动设的甚至可以 DoH

MTU 没分 IPv4/6,AutoOutboundsInterface 也是,不过它对 Xray 现有代码来说也麻烦

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

DNS 不配置时是什么行为?

据我观察是走默认 dns,但因为国内 dns 可能屏蔽境外 ip 导致连接不通

改成 udp://1.1.1.1:53 这种形式?DHCP 支持自定义端口吗?因为我看手动设的甚至可以 DoH

接口好像只开放了 ip,连 port 都没有,倒是有个 suffix 匹配域名走 dns 的参数,doh 通过劫持 dns 实现吧

MTU 没分 IPv4/6,AutoOutboundsInterface 也是,不过它对 Xray 现有代码来说也麻烦

mtu 我设置的时候也感觉怪怪的,人家是 v4 576 v6 1280,这里直接通一 1500

不过也就 win linux darwin 可以设置,移动端只有个 fd,可能还没权限

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Apr 12, 2026

doh 通过劫持 dns 实现吧

感觉不全是?浏览器有些查询是不是必须基于原生 DoH?

按你这么说的话这里甚至可以设计成 fakeip 那种,可以劫持 fakeip:53 然后实现任何类型的 DNS,不过 Xray 本来就能实现

那这里就保持现有设计吧,只填 IP,如果想搞骚操作的话可以随便填个然后用 Xray 劫持,不过一般可能会劫持所有 DNS 吧

打完字才觉得你本来就是这个意思,不过它是怎么遵循这个 DNS 的,看可能的路由?

mtu 我设置的时候也感觉怪怪的

趁没啥 GUI 支持,break 一下改成数组吧,若只有一个成员就是 v4v6 相同,若有两个成员就是第一个是 v4

如果 Name 要两个的话似乎要针对 v4/v6 分别起网卡,name 就算了

另外有两个名字你忘改了,改一下,然后应该可以合了

@LjhAUMEM
Copy link
Copy Markdown
Collaborator Author

打完字才觉得你本来就是这个意思,不过它是怎么遵循这个 DNS 的,看可能的路由?

这就要提到 win 上著名的智能多宿主解析了,组策略 -> 管理模板 -> 网络 -> DNS 客户端 -> 禁用智能多宿主名称解析,如果显示不禁用就是每个网卡都发一遍

趁没啥 GUI 支持,break 一下改成数组吧,若只有一个成员就是 v4v6 相同,若有两个成员就是第一个是 v4

done

另外有两个名字你忘改了,改一下,然后应该可以合了

哦哦,原来上面的名字 infra 也改吗,以为只是 proto 的,我又看漏了,done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants